/**
 * PLM项目研发项目服务
 */
const BaseService = require('./base_service');
const helpers = require('../config/project_helpers_config');
const { dayjs } = require('../config/libs_config');
const { 
	dataHelper,
	timeHelper,
	cloudHelper,
	pageHelper 
} = helpers;

// 使用模型配置
const { ResearchProjectModel } = require('../config/models_config');

// 缓存KEY
const CACHE_PREFIX = 'CACHE_PLM_RESEARCH_PROJECT_';

class ResearchProjectService extends BaseService {

	/**
	 * 构造函数
	 */
	constructor() {
		super();
		try {
			this._db = wx.cloud.database();
			this._collection = this._db.collection('plm_research_project');
		} catch (e) {
			console.warn('初始化数据库失败', e);
			// 提供空对象防止调用报错
			this._db = {};
			this._collection = { where: () => ({ get: async () => ({ data: [] }) }) };
		}
	}

	/**
	 * 获取项目列表
	 * @param {Object} params 查询参数
	 */
	async getProjectList(params = {}) {
		try {
			// 构造查询参数
			const queryParams = {
				search: params.search || '',
				sortType: params.sortType || '',
				sortVal: params.sortVal || '',
				status: params.status || -1,
				page: params.page || 1,
				size: params.size || 20
			};
			
			// 调用云函数获取数据
			const result = await cloudHelper.callCloudData('plm_research/list', queryParams, {
				title: '加载中',
				loading: true
			});
			
			// 处理项目列表数据，确保model字段是首选型号字段
			const processedList = this._processProjectList(result.list);
			
			// 返回结果
			return {
				list: processedList,
				total: result.total || 0
			};
		} catch (err) {
			console.error('[PLM研发项目] 获取列表错误:', err);
			throw err;
		}
	}

	/**
	 * 获取项目详情
	 * @param {String} id 项目ID
	 */
	async getProjectDetail(id) {
		try {
			// 参数验证
			if (!id) {
				throw new Error('项目ID不能为空');
			}
			
			// 尝试从缓存获取
			const cacheKey = CACHE_PREFIX + id;
			const cacheData = wx.getStorageSync(cacheKey);
			if (cacheData && cacheData.time && dayjs().valueOf() - cacheData.time < 5 * 60 * 1000) {
				// 缓存有效期5分钟内
				return cacheData.data;
			}
			
			// 调用云函数获取详情
			const result = await cloudHelper.callCloudData('plm_research/detail', { id }, {
				title: '加载中',
				loading: true
			});
			
			// 缓存结果
			wx.setStorageSync(cacheKey, {
				time: dayjs().valueOf(),
				data: result
			});
			
			// 处理项目数据，确保model字段是首选型号字段
			const processedData = this._processProjectData(result);
			
			return processedData;
		} catch (err) {
			console.error('[PLM研发项目] 获取详情错误:', err);
			throw err;
		}
	}

	/**
	 * 创建项目
	 * @param {Object} data 项目数据
	 */
	async createProject(data) {
		try {
			// 调用云函数创建项目
			return await cloudHelper.callCloudData('plm_research/insert', data, {
				title: '创建中',
				loading: true
			});
		} catch (err) {
			console.error('[PLM研发项目] 创建项目错误:', err);
			throw err;
		}
	}

	/**
	 * 更新项目
	 * @param {String} id 项目ID
	 * @param {Object} data 更新数据
	 */
	async updateProject(id, data) {
		try {
			// 参数验证
			if (!id) {
				throw new Error('项目ID不能为空');
			}
			
			// 调用云函数更新项目
			const result = await cloudHelper.callCloudData('plm_research/edit', {
				id,
				data
			}, {
				title: '更新中',
				loading: true
			});
			
			// 更新后清理缓存
			const cacheKey = CACHE_PREFIX + id;
			wx.removeStorageSync(cacheKey);
			
			return result;
		} catch (err) {
			console.error('[PLM研发项目] 更新项目错误:', err);
			throw err;
		}
	}

	/**
	 * 删除项目
	 * @param {String} id 项目ID
	 */
	async deleteProject(id) {
		try {
			// 参数验证
			if (!id) {
				throw new Error('项目ID不能为空');
			}
			
			// 调用云函数删除项目
			const result = await cloudHelper.callCloudData('plm_research/delete', { id }, {
				title: '删除中',
				loading: true
			});
			
			// 删除后清理缓存
			const cacheKey = CACHE_PREFIX + id;
			wx.removeStorageSync(cacheKey);
			
			return result;
		} catch (err) {
			console.error('[PLM研发项目] 删除项目错误:', err);
			throw err;
		}
	}

	// 处理项目数据，确保model字段是首选型号字段
	_processProjectData(project) {
		if (!project) return project;
		
		// 删除name和model字段的同步逻辑，保持字段独立
		// 确保model字段是首选型号字段
		
		return project;
	}
	
	// 处理项目列表数据，确保model字段是首选型号字段
	_processProjectList(list) {
		if (!list || !Array.isArray(list)) return list;
		
		return list.map(item => this._processProjectData(item));
	}
}

// 创建单例
const researchProjectService = new ResearchProjectService();

// 导出服务类和单例
module.exports = {
	ResearchProjectService,
	researchProjectService
}; 